package com.ajview.common.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.Assert;

import java.util.Date;
import java.util.Map;

/**
 * JWT工具类
 *
 * @author beloved
 */
@Slf4j
public class JwtUtils {

    /**
     * 默认加密算法
     */
    public final static SignatureAlgorithm SIGNATURE_ALGORITHM = SignatureAlgorithm.HS256;

    /**
     * 创建一个设置 创建时间，秘钥，加密方式，参数的token
     *
     * @param claims             参数，荷载
     * @param secret             秘钥
     * @param signatureAlgorithm 加密方式
     * @return token
     */
    public static String createToken(Map<String, Object> claims, String secret, SignatureAlgorithm signatureAlgorithm) {
        // false 抛异常 生成token的秘钥长度错误必须大于10位
        Assert.isTrue(secret.length() > 10, "生成token的秘钥长度错误必须大于10位！");
        Date now = new Date(System.currentTimeMillis());
        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(now)
                .signWith(signatureAlgorithm, secret).compact();
    }

    /**
     * 判断是否过期 过期后抛出异常 ExpiredJwtException
     *
     * @param token  JWT令牌
     * @param secret 密钥
     * @return 是否过期 返回false则没有过期，true未过期
     */
    public static Boolean isExpiration(String token, String secret) {
        try {
            Claims claims = getClaims(token, secret);
            Date expiration = claims.getExpiration();
            // 是否在当前时间之前
            return expiration.before(new Date());
        } catch (ExpiredJwtException e) {
            log.error("当前令牌已经过期:" + e);
        }
        return true;
    }

    /**
     * 获取数据数据
     *
     * @param token  JWT令牌
     * @param secret 密钥
     * @return 声名的数据，存入claims的值
     */
    public static Claims getClaims(String token, String secret) {
        return Jwts.parser()
                .setSigningKey(secret)
                .parseClaimsJws(token)
                .getBody();
    }
}
